package cn.shopifymall.hw_od;

import java.util.Stack;

/**
 * @Author 孤风雪影
 * @Email gitee.com/efairy520
 * @Date 2023/5/27 10:29
 * @Version 1.0
 */
public class HJ09 {
    /*
    * 
    * 给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。

有效字符串需满足：

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
 
示例 1：

输入：s = "()"
输出：true
示例 2：

输入：s = "()[]{}"
输出：true
示例 3：

输入：s = "(]"
输出：false
示例 4：

输入：s = "([)]"
输出：false
示例 5：

输入：s = "{[]}"
输出：true
"(([]){})"

({{[]}([])}())

class Solution {
    public boolean isValid(String s) {

    }
}*/
    public static void main(String[] args) {
        // true ok
        // String s1 = "()";
        // boolean valid = isValid(s1);
        // System.out.println("valid = " + valid);

        // true ok
        // String s2 = "()[]{}";
        // boolean valid = isValid(s2);
        // System.out.println("valid = " + valid);

        // false ok
        // String s3 = "(]";
        // boolean valid = isValid(s3);
        // System.out.println("valid = " + valid);

        // false ok
        // String s4 = "([)]";
        // boolean valid = isValid(s4);
        // System.out.println("valid = " + valid);

        // true ok
        // String s5 = "{[]}";
        // boolean valid = isValid(s5);
        // System.out.println("valid = " + valid);
        

        // true ok
        // String s6 = "(([]){})";
        // boolean valid = isValid(s6);
        // System.out.println("valid = " + valid);

        // true ok
        String s7 = "({{[]}([])}())";
        boolean valid = isValid(s7);
        System.out.println("valid = " + valid);
    }

    public static boolean isValid(String s) {

        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            if (c == '(') {
                stack.push(')');
            } else if (c == '[') {
                stack.push(']');
            } else if (c == '{') {
                stack.push('}');
            } else if (stack.isEmpty() || stack.pop() != c){
                return false;
            }
        }
        
        return stack.isEmpty();
    }
}
